#include "stm32f10x.h"                  // Device header
#include "DELAY.h"

#define iic_w_scl(x) GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)(x));delay_us(10)
#define iic_w_sda(x) GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)(x));delay_us(10)

uint8_t iic_r_sda(void)
{
	uint8_t bitvalue;
	
	bitvalue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
	delay_us(10);
	return bitvalue;
}


void iic_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef iic_gpio_init;
	iic_gpio_init.GPIO_Mode=GPIO_Mode_Out_OD;
	iic_gpio_init.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;
	iic_gpio_init.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&iic_gpio_init);
	
	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);
}

void iic_start(void)
{
	iic_w_sda(1);
	iic_w_scl(1);
	iic_w_sda(0);
	iic_w_scl(0);
}

void iic_stop(void)
{
	iic_w_sda(0);
	iic_w_scl(1);
	iic_w_sda(1);
}

void iic_sendbyte(uint8_t byte)
{
	uint8_t i;
	for(i=0;i<8;i++)
	{
		iic_w_sda(byte&(0x80>>i));
		iic_w_scl(1);
		iic_w_scl(0);
	}
}

uint8_t iic_receivebyte(void)
{
	uint8_t byte=0x00;
	uint8_t i=0;
	iic_w_sda(1);

	
	for(i=0;i<8;i++)
	{
		iic_w_scl(1);
		if(iic_r_sda()==1)
			byte|=(0x80>>i);
		iic_w_scl(0);
	}
	return byte;
}

void iic_sendack(uint8_t byte)
{
	iic_w_sda(byte);
	iic_w_scl(1);
	iic_w_scl(0);
}

uint8_t iic_receiveack(void)
{
	uint8_t bit;
	iic_w_sda(1);
	iic_w_scl(1);
	bit=iic_r_sda();
	iic_w_scl(0);
	return bit;
}

